package leetcode.N601_N700;

/**
 * @author xiwai [hww282306@alibaba-inc.com]
 * @version 1.0
 * @date 2020/10/20 12:51 下午
 */
public class N695 {

    public static void main(String[] args) {
        int[][] a = {{0, 1}};
        System.out.println(maxAreaOfIsland(a));
    }

    static int maxArea = 0;

    public static int maxAreaOfIsland(int[][] grid) {
        int maxRow = grid.length;
        if (maxRow == 0) {
            return maxArea;
        }
        int maxColumn = grid[0].length;
        if (maxColumn == 0) {
            return maxArea;
        }
        for (int i = 0; i < maxRow; i++) {
            for (int j = 0; j < maxColumn; j++) {
                if (grid[i][j] == 1) {
                    explore(grid, i, j, maxRow - 1, maxColumn - 1);
                }
            }
        }
        return maxArea;
    }

    private static int explore(int[][] world, int currentRow, int currentColumn, int maxRow, int maxColumn) {
        // 当前区域面积
        int currentArea = world[currentRow][currentColumn];
        // 当前面积为0 则不需要再变
        if (currentArea == 0) {
            return 0;
        }

        // 1. 出发前 先把当前区域设置为0 防止重复计算
        world[currentRow][currentColumn] = 0;
        // 每个点 都触发4个方向的动作 上下左右
        int upArea = 0;
        int downArea = 0;
        int leftArea = 0;
        int rightArea = 0;
        // 2. 往上 需要满足一个条件 当前行不是第一行
        if (currentRow > 0) {
            upArea = explore(world, currentRow - 1, currentColumn, maxRow, maxColumn);
        }

        // 3. 往下 需要满足一个条件 当前行不是最后一行
        if (currentRow < maxRow) {
            downArea = explore(world, currentRow + 1, currentColumn, maxRow, maxColumn);
        }

        // 4. 往左 需要满足一个条件 当前列不是第一列
        if (currentColumn > 0) {
            leftArea = explore(world, currentRow, currentColumn - 1, maxRow, maxColumn);
        }

        // 5. 往右 需要满足一个条件 当前列不是最后一列
        if (currentColumn < maxColumn) {
            rightArea = explore(world, currentRow, currentColumn + 1, maxRow, maxColumn);
        }

        // 计算面积
        currentArea = currentArea + upArea + downArea + leftArea + rightArea;
        maxArea = Math.max(maxArea, currentArea);
        return currentArea;
    }

}
